﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using Cursosycausas.Mvc.Models;
using System.Data.Entity.Infrastructure;
using System.Data;

namespace Cursosycausas.Mvc.DAL
{
    public class CursosyCausasUnitOfWork : DbContext, ICursosyCausasUnitOfWork
    {
        private IDbSet<Tbl_Aula> _aulas;
        public IDbSet<Tbl_Aula> Aulas
        {
            get
            {
                if (_aulas == null)
                    _aulas = base.Set<Tbl_Aula>();
                return _aulas;
            }
        }

        private IDbSet<Tbl_Aulas_Materias> _aulas_Materias;
        public IDbSet<Tbl_Aulas_Materias> Aulas_Materias
        {
            get
            {
                if (_aulas_Materias == null)
                    _aulas_Materias = base.Set<Tbl_Aulas_Materias>();
                return _aulas_Materias;
            }
        }


        private IDbSet<Tbl_Aulas_Materias_Temas> _aulas_Materias_Temas;
        public IDbSet<Tbl_Aulas_Materias_Temas> Aulas_Materias_Temas
        {
            get
            {
                if (_aulas_Materias_Temas == null)
                    _aulas_Materias_Temas = base.Set<Tbl_Aulas_Materias_Temas>();
                return _aulas_Materias_Temas;
            }
        }


        private IDbSet<Tbl_Aulas_Materias_Temas_Contenidos> _aulas_Materias_Temas_Contenidos;
        public IDbSet<Tbl_Aulas_Materias_Temas_Contenidos> Aulas_Materias_Temas_Contenidos
        {
            get
            {
                if (_aulas_Materias_Temas_Contenidos == null)
                    _aulas_Materias_Temas_Contenidos = base.Set<Tbl_Aulas_Materias_Temas_Contenidos>();
                return _aulas_Materias_Temas_Contenidos;
            }
        }
        

        private IDbSet<Tbl_Aulas_Materias_Temas_Examenes> _aulas_Materias_Temas_Examenes;
        public IDbSet<Tbl_Aulas_Materias_Temas_Examenes> Aulas_Materias_Temas_Examenes
        {
            get
            {
                if (_aulas_Materias_Temas_Examenes == null)
                    _aulas_Materias_Temas_Examenes = base.Set<Tbl_Aulas_Materias_Temas_Examenes>();
                return _aulas_Materias_Temas_Examenes;
            }
        }


        private IDbSet<Tbl_Aulas_Usuarios> _aulas_Usuarios;
        public IDbSet<Tbl_Aulas_Usuarios> Aulas_Usuarios
        {
            get
            {
                if (_aulas_Usuarios == null)
                    _aulas_Usuarios = base.Set<Tbl_Aulas_Usuarios>();
                return _aulas_Usuarios;
            }
        }


       

        private IDbSet<Tbl_Aulas_Usuarios_Materias_Temas_Contenidos> _aulas_Usuarios_Materias_Temas_Contenidos;
        public IDbSet<Tbl_Aulas_Usuarios_Materias_Temas_Contenidos> Aulas_Usuarios_Materias_Temas_Contenidos
        {
            get
            {
                if (_aulas_Usuarios_Materias_Temas_Contenidos == null)
                    _aulas_Usuarios_Materias_Temas_Contenidos = base.Set<Tbl_Aulas_Usuarios_Materias_Temas_Contenidos>();
                return _aulas_Usuarios_Materias_Temas_Contenidos;
            }
        }

        private IDbSet<Tbl_Aulas_Usuarios_Materias_Temas_Examenes> _aulas_Usuarios_Materias_Temas_Examenes;
        public IDbSet<Tbl_Aulas_Usuarios_Materias_Temas_Examenes> Aulas_Usuarios_Materias_Temas_Examenes
        {
            get
            {
                if (_aulas_Usuarios_Materias_Temas_Examenes == null)
                    _aulas_Usuarios_Materias_Temas_Examenes = base.Set<Tbl_Aulas_Usuarios_Materias_Temas_Examenes>();
                return _aulas_Usuarios_Materias_Temas_Examenes;
            }
        }


        private IDbSet<Tbl_Contenido> _contenido;
        public IDbSet<Tbl_Contenido> Contenido
        {
            get
            {
                if (_contenido == null)
                    _contenido = base.Set<Tbl_Contenido>();
                return _contenido;
            }
        }


        private IDbSet<Tbl_Derecho> _derecho;
        public IDbSet<Tbl_Derecho> Derecho
        {
            get
            {
                if (_derecho == null)
                    _derecho = base.Set<Tbl_Derecho>();
                return _derecho;
            }
        }


        private IDbSet<Tbl_Materia> _materia;
        public IDbSet<Tbl_Materia> Materia
        {
            get
            {
                if (_materia == null)
                    _materia = base.Set<Tbl_Materia>();
                return _materia;
            }
        }


        private IDbSet<Tbl_Noticia> _noticia;
        public IDbSet<Tbl_Noticia> Noticia
        {
            get
            {
                if (_noticia == null)
                    _noticia = base.Set<Tbl_Noticia>();
                return _noticia;
            }
        }

        public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
        {
            return base.Set<TEntity>();
        }

        public void Attach<TEntity>(TEntity item) where TEntity : class
        {
            if (base.Entry<TEntity>(item).State == EntityState.Detached)
            {
                base.Set<TEntity>().Attach(item);
            }
        }

        public void SetModified<TEntity>(TEntity item) where TEntity : class
        {
            base.Entry<TEntity>(item).State = EntityState.Modified;
        }

        public IEnumerable<TEntity> ExecuteQuery<TEntity>(string sqlQuery, params object[] parameters)
        {
            return base.Database.SqlQuery<TEntity>(sqlQuery, parameters);
        }

        public int ExecuteCommand(string sqlCommand, params object[] parameters)
        {
            return base.Database.ExecuteSqlCommand(sqlCommand, parameters);
        }

        public void Commit()
        {
            base.SaveChanges();
        }

        public void CommitAndRefreshChanges()
        {
            bool saveFailed = false;

            do
            {
                try
                {
                    base.SaveChanges();

                    saveFailed = false;

                }
                catch (DbUpdateConcurrencyException ex)
                {
                    saveFailed = true;

                    ex.Entries.ToList()
                              .ForEach(entry =>
                              {
                                  entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                              });
                }
            } while (saveFailed);
        }

        public void Rollback()
        {
            base.ChangeTracker.Entries()
                             .ToList()
                             .ForEach(entry => entry.State = System.Data.EntityState.Unchanged);
        }


        
    }
}
